﻿#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>
#include <Windows.h>
#include <string.h>
extern int A;
//数组元素使用下标输出
//int main()
//{
//	int array[10] = {123,456,44,55};
//
//	for (int i = 0; i < 10; i++)
//	{
//		printf("array[%02d]=%03d\n", i, array[i]);
//	}
//	return 0;
//}

//数组元素地址输出
//int main()
//{
//	int array[10] = {123,456,44,55};
//
//	for (int i = 0; i < 10; i++)
//	{
//		printf("array[%02d]=%03d\t address:%p\n", i, array[i],&array[i]);
//	}
//	return 0;
//}

//使用scanf对数组元素进行填充
//int main()
//{
//	int array[10] = {123,456,44,55};
//
//	for (int i = 0; i < 10; i++)
//	{
//		printf("array[%02d]=%03d\n", i, array[i]);
//	}
//	printf("\please fill array \n");
//	for (int i = 0; i < 10; i++)
//	{
//		printf("array[%02d]=", i);
//		scanf("%d", &array[i]);
//	}
//	printf("\nfill array success\n");
//	for (int i = 0; i < 10; i++)
//	{
//		printf("array[%02d]=%03d\n", i, array[i]);
//	}
//	return 0;
//}


//使用sizeof求解数组大小
//int main()
//{
//	//char array[100] = {0};
//	//char array[10] = { 0 };
//	//int array[100] = {0};
//	int array[10] = { 0 };
//	printf("array length:%d byte\n", (int)sizeof(array) );
//	printf("array[0] length:%d byte\n", (int)sizeof(array[0]));
//	printf("array length:%d 个\n", (int)(sizeof(array) / sizeof(array[0])));
//	return 0;
//}

/***************************二维数组***************************/
//使用scanf对二维数组元素进行填充
//int main()
//{
//	int array[2][3] = {0};
//
//	for (int i = 0; i < 2; i++)
//	{
//		for (int j = 0; j < 3; j++)
//		{
//			printf("array[%02d][%02d]=%03d\t", i,j, array[i][j]);
//		}
//		printf("\n");
//	}
//	printf("\please fill array \n");
//	for (int i = 0; i < 2; i++)
//	{
//		for (int j = 0; j <3; j++)
//		{
//			printf("array[%02d][%02d]=", i, j);
//			scanf("%d", &array[i][j]);
//		}
//	}
//	printf("\nfill array success\n");
//	for (int i = 0; i < 2; i++)
//	{
//		for (int j = 0; j < 3; j++)
//		{
//			printf("array[%02d][%02d]=%03d\t", i, j, array[i][j]);
//		}
//		printf("\n");
//	}
//	return 0;
//}

//输出二维数组元素的地址
//int main()
//{
//	int array[2][3] = {{1,2,3},{4,5,6}};
//
//	for (int i = 0; i < 2; i++)
//	{
//		for (int j = 0; j < 3; j++)
//		{
//			printf("array[%02d][%02d]=%03d address:%p\t", i,j, array[i][j],&array[i][j]);
//		}
//		printf("\n");
//	}
//
//	return 0;
//}

/**********************************数组练习**********************************/

//练习1：多个字符从两端移动，向中间汇聚
//int main()
//{
//	char one_string[] = "Hell0, C!";
//	char zero_string[] ="#########";
//
//	int left = 0;
//	int right = strlen(one_string)-1;
//	printf("zero_string=%s\n", zero_string);
//	printf("\nstart\n\n");
//	while (left<=right)
//	{
//		Sleep(1000);
//		zero_string[left] = one_string[left];
//		zero_string[right] = one_string[right];
//		left++;
//		right--;
//		printf("zero_string=%s\n", zero_string);
//
//	}
//	printf("\nend\n");
//	return 0;
//}


//练习2：⼆分查找
//在⼀个升序的数组中查找指定的数字n，很容易想到的⽅法就是遍历数组，但是这种⽅法效率⽐较低。
//⽐如我买了⼀双鞋，你好奇问我多少钱，我说不超过300元。你还是好奇，你想知道到底多少，我就让
//你猜，你会怎么猜？你会1，2，3，4...这样猜吗？显然很慢；⼀般你都会猜中间数字，⽐如：150，然
//后看⼤了还是⼩了，这就是⼆分查找，也叫折半查找。
int main()
{
	int array[11] = {0,1,2,3,4,5,6,7,8,9,10};
	int buffer = 0;
	int array_lentgth_max = (int)(sizeof(array) / sizeof(array[0]));
	int array_lentgth_index = 0;
	printf("请输入一个数：");
	scanf("%d",&buffer);//获取要查找的数字
	array_lentgth_index = array_lentgth_max / 2 + 1 - 1;//第一次的终点查询
	while (1)
	{
		
		if (array[array_lentgth_index] == buffer)
		{
			//找到就跳出循环
			printf("找到了，%d在array[%d]中", buffer, array_lentgth_index);
			break;
		}
		else if (buffer< array[array_lentgth_index])
		{
			//输入值小于当前中点，则下次中点向左靠近
			array_lentgth_index = array_lentgth_index / 2 + 1 - 1;
		}
		else
		{
			//输入值大于当前中点，则下次中点向左靠近
			array_lentgth_index = (array_lentgth_max - array_lentgth_index)/2+1-1+ array_lentgth_index;
		}
		
	}

	return 0;
}
